package cn.cumulomq.parse;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.log4j.Logger;
import org.dom4j.DocumentException;

import cn.ait.parser.IParser;
import cn.ait.parser.MessageToMap;
import cn.ait.parser.UnknowMessage;
import cn.ait.parser.exception.ParseException;
import cn.ait.parser.exception.ValidationException;
import cn.ait.parser.template.ParseTemplate;
import cn.cumulomq.entity.TeleMessage;
import cn.cumulomq.utils.JsonMapper;
import cn.cumulomq.utils.PropertiesUtil;
/**
 * 报文解析管理
 * @author maxuedong
 *
 */
public class ParseManage {
	private Logger logger = Logger.getLogger(ParseManage.class);
	private String parseTypes;
	private static ParseManage pm = new ParseManage();
	
	private Map<String,List<ParseTemplate>> templateMap = new HashMap<String,List<ParseTemplate>>();
	
	private ParseManage(){}
	public static ParseManage getInstance(){
		return pm;
	}
	/**
	 * 初始化报文模板
	 */
	public void init(){
		logger.info("Start init message parse template.");
		parseTypes = PropertiesUtil.getProperty("message.parseTypes");
		
		String[] types = parseTypes.trim().split("\\|");
		for(String type:types){
			String[] templates = PropertiesUtil.getProperty("message.template."+type).trim().split("\\|");
			List<ParseTemplate> list = new ArrayList<ParseTemplate>();
			for(String template:templates){
				logger.info("Load "+type+" templates "+template);	
				try {
					
					ParseTemplate pt = new ParseTemplate(Resources.getResourceAsFile(template));
					list.add(pt);
				} catch (DocumentException e) {
					logger.error("Template not found."+template,e);
				} catch (IOException e) {
					logger.error("Template not found..."+template,e);
				}
			}
			templateMap.put(type, list);
		}
		logger.info("End init message parse template.");
	}
	/**
	 * 根据报文类型获取解析模板
	 * @param msgType
	 * @return
	 */
	public List<ParseTemplate> getParseTemplateByType(String msgType){
		return templateMap.get(msgType);
	}
	public String messageToJson(TeleMessage teleMessage){
		List<ParseTemplate> templates =  getParseTemplateByType(teleMessage.getMsgCategory());
		IParser ip = new MessageToMap();
		if(templates==null)return null;
		for(ParseTemplate pt : templates){
			try {
				List<UnknowMessage> unknowList = ip.parse(pt, teleMessage.getText());
				if(unknowList.size()==0){
					teleMessage.setParseJson(JsonMapper.getInstance().toJson(ip.getMessage()));
					teleMessage.setParseMap((Map<String, Object>) ip.getMessage());
					break;
				}else{
					teleMessage.setParseError(JsonMapper.getInstance().toJson(unknowList));
					continue;
				}
			} catch (ParseException e) {
				logger.error("Parse message error,msgTxt:"+teleMessage.getText(),e);
			} catch (ValidationException e) {
				logger.error("Validate message error,msgTxt:"+teleMessage.getText(),e);
			}
		}
		return teleMessage.getParseJson();
	}
}
